{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "from keras.layers import Input, Dense, LSTM\n",
    "from keras.models import Model\n",
    "from keras.layers import *\n",
    "from keras.models import *\n",
    "from keras.optimizers import Adam\n",
    "from keras.callbacks import EarlyStopping"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "import time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv(\"data/沪深300天级别数据.csv\",header=0,index_col=None,sep='\\s+',parse_dates=[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>time</th>\n",
       "      <th>open</th>\n",
       "      <th>close</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>volume</th>\n",
       "      <th>money</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2012-01-04</td>\n",
       "      <td>2361.50</td>\n",
       "      <td>2298.75</td>\n",
       "      <td>2365.99</td>\n",
       "      <td>2298.30</td>\n",
       "      <td>3434456700</td>\n",
       "      <td>32572551267</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2012-01-05</td>\n",
       "      <td>2290.78</td>\n",
       "      <td>2276.39</td>\n",
       "      <td>2316.66</td>\n",
       "      <td>2272.15</td>\n",
       "      <td>4301648000</td>\n",
       "      <td>37635272074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2012-01-06</td>\n",
       "      <td>2274.35</td>\n",
       "      <td>2290.60</td>\n",
       "      <td>2291.89</td>\n",
       "      <td>2254.57</td>\n",
       "      <td>3519899200</td>\n",
       "      <td>31079362325</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2012-01-09</td>\n",
       "      <td>2291.18</td>\n",
       "      <td>2368.57</td>\n",
       "      <td>2368.89</td>\n",
       "      <td>2271.72</td>\n",
       "      <td>5472734100</td>\n",
       "      <td>51478126954</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2012-01-10</td>\n",
       "      <td>2365.77</td>\n",
       "      <td>2447.35</td>\n",
       "      <td>2449.95</td>\n",
       "      <td>2361.28</td>\n",
       "      <td>8115498900</td>\n",
       "      <td>75249157103</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2012-01-11</td>\n",
       "      <td>2444.76</td>\n",
       "      <td>2435.61</td>\n",
       "      <td>2453.15</td>\n",
       "      <td>2423.32</td>\n",
       "      <td>5870567400</td>\n",
       "      <td>57587219272</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>2012-01-12</td>\n",
       "      <td>2426.82</td>\n",
       "      <td>2435.22</td>\n",
       "      <td>2464.38</td>\n",
       "      <td>2423.32</td>\n",
       "      <td>4712127500</td>\n",
       "      <td>47877407259</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>2012-01-13</td>\n",
       "      <td>2438.41</td>\n",
       "      <td>2394.33</td>\n",
       "      <td>2445.79</td>\n",
       "      <td>2374.55</td>\n",
       "      <td>4551399700</td>\n",
       "      <td>47228338588</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        time     open    close     high      low      volume        money\n",
       "0 2012-01-04  2361.50  2298.75  2365.99  2298.30  3434456700  32572551267\n",
       "1 2012-01-05  2290.78  2276.39  2316.66  2272.15  4301648000  37635272074\n",
       "2 2012-01-06  2274.35  2290.60  2291.89  2254.57  3519899200  31079362325\n",
       "3 2012-01-09  2291.18  2368.57  2368.89  2271.72  5472734100  51478126954\n",
       "4 2012-01-10  2365.77  2447.35  2449.95  2361.28  8115498900  75249157103\n",
       "5 2012-01-11  2444.76  2435.61  2453.15  2423.32  5870567400  57587219272\n",
       "6 2012-01-12  2426.82  2435.22  2464.38  2423.32  4712127500  47877407259\n",
       "7 2012-01-13  2438.41  2394.33  2445.79  2374.55  4551399700  47228338588"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head(8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2024, 7)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_feature = df[['close','open','high', 'low', 'volume', 'money']].astype('float')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "sample_num = df.shape[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_num = int(df.shape[0] * 0.8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_num = df.shape[0] - train_num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2024, 1619, 405)"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sample_num,train_num,test_num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1619, 6) (405, 6)\n"
     ]
    }
   ],
   "source": [
    "data_train = df_feature.iloc[:train_num, :]\n",
    "data_test = df_feature.iloc[train_num:, :]\n",
    "print(data_train.shape, data_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "MinMaxScaler(copy=True, feature_range=(0, 1))"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scaler = MinMaxScaler(feature_range=(0, 1))\n",
    "scaler.fit(data_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_train = scaler.transform(data_train)\n",
    "data_test = scaler.transform(data_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1619,) (405,)\n"
     ]
    }
   ],
   "source": [
    "data_train_y = np.array(df_feature.iloc[:train_num, 0])\n",
    "data_test_y = np.array(df_feature.iloc[train_num:, 0])\n",
    "print(data_train_y.shape, data_test_y.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "PAST_TIME_STEPS = 10\n",
    "NEXT_TIME_STEPS = 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "#X_train = np.array([data_train[i : i + PAST_TIME_STEPS, :] for i in range(0,data_train.shape[0] - (NEXT_TIME_STEPS+ PAST_TIME_STEPS),4)])\n",
    "#X_test = np.array([data_test[i : i + PAST_TIME_STEPS, :] for i in range(0,data_test.shape[0] - (NEXT_TIME_STEPS+ PAST_TIME_STEPS),4)])\n",
    "X_train = np.array([data_train[i : i + PAST_TIME_STEPS, :] for i in range(0,data_train.shape[0] - (NEXT_TIME_STEPS+ PAST_TIME_STEPS),1)])\n",
    "X_test = np.array([data_test[i : i + PAST_TIME_STEPS, :] for i in range(0,data_test.shape[0] - (NEXT_TIME_STEPS+ PAST_TIME_STEPS),1)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "#y_train_regression = np.array([data_train_y[i + PAST_TIME_STEPS + NEXT_TIME_STEPS-1] for i in range(0,data_train.shape[0] - (NEXT_TIME_STEPS+ PAST_TIME_STEPS),4)])\n",
    "#y_test_regression = np.array([data_test_y[i + PAST_TIME_STEPS + NEXT_TIME_STEPS-1] for i in range(0,data_test.shape[0] - (NEXT_TIME_STEPS+ PAST_TIME_STEPS),4)])\n",
    "\n",
    "y_train_regression = np.array([data_train_y[i + PAST_TIME_STEPS + NEXT_TIME_STEPS] for i in range(0,data_train.shape[0] - (NEXT_TIME_STEPS+ PAST_TIME_STEPS),1)])\n",
    "y_test_regression = np.array([data_test_y[i + PAST_TIME_STEPS + NEXT_TIME_STEPS] for i in range(0,data_test.shape[0] - (NEXT_TIME_STEPS+ PAST_TIME_STEPS),1)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1606, 10, 6) (1606,) (392, 10, 6) (392,)\n"
     ]
    }
   ],
   "source": [
    "print(X_train.shape, y_train_regression.shape, X_test.shape,y_test_regression.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "INPUT_DIM = data_train.shape[1]\n",
    "output_dim = 1\n",
    "batch_size = 8 #每轮训练模型时，样本的数量\n",
    "epochs = 100 #训练60轮次\n",
    "hidden_size = 128\n",
    "lstm_units = 64"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "def LSTM_fun(n_input,train_x,train_y,predict_x,prediction_y,seq_len=5):\n",
    "    #LSTM\n",
    "    lr=0.001\n",
    "    lstm_size = 100  #lstm cell数量，基于数据量调整\n",
    "    epoch_num = 10  #打印次数，和n_batch相乘便是迭代次数\n",
    "    n_batch = 300\n",
    "    lookback = seq_len\n",
    "    tf.reset_default_graph()\n",
    "\n",
    "\n",
    "    x = tf.placeholder(tf.float32,[None,lookback,n_input])\n",
    "    y = tf.placeholder(tf.float32,[None,1])\n",
    "\n",
    "    weights = tf.Variable(tf.truncated_normal([lstm_size,1],stddev=0.1))\n",
    "    biases = tf.Variable(tf.constant(0.1,shape=[1]))\n",
    "\n",
    "    def LSTM_net(x,weights,biases):\n",
    "        lstm_cell = tf.contrib.rnn.LSTMCell(lstm_size,name='basic_lstm_cell') #.BasicLSTMCell(lstm_size)\n",
    "        output,final_state = tf.nn.dynamic_rnn(lstm_cell,x,dtype=tf.float32)\n",
    "        results = tf.matmul(final_state[1],weights)+biases\n",
    "        return results\n",
    "\n",
    "    prediction = LSTM_net(x,weights,biases)\n",
    "\n",
    "    loss = tf.reduce_mean(tf.square(y - prediction))\n",
    "\n",
    "    #train_step = tf.train.GradientDescentOptimizer(lr).minimize(loss)\n",
    "    train_step = tf.train.AdamOptimizer(lr).minimize(loss)\n",
    "\n",
    "    init = tf.global_variables_initializer()\n",
    "    with tf.Session() as sess:\n",
    "        sess.run(init)\n",
    "        for i in range(epoch_num):\n",
    "            for j in range(n_batch):\n",
    "                sess.run(train_step,feed_dict={x:train_x,y:train_y})\n",
    "                train_loss = sess.run(loss,feed_dict={x:train_x,y:train_y})\n",
    "            print('train loss is'+ str(train_loss))\n",
    "        prediction_res = sess.run(prediction,feed_dict={x:predict_x})\n",
    "    return prediction_res\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "Cannot feed value of shape (1606,) for Tensor 'Placeholder_1:0', which has shape '(?, 1)'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-26-7b99b2bf09a8>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0my_pred_regression\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mLSTM_fun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mINPUT_DIM\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mX_train\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_train_regression\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mX_test\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_test_regression\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mseq_len\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mPAST_TIME_STEPS\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32m<ipython-input-25-8181b4c750d0>\u001b[0m in \u001b[0;36mLSTM_fun\u001b[1;34m(n_input, train_x, train_y, predict_x, prediction_y, seq_len)\u001b[0m\n\u001b[0;32m     33\u001b[0m         \u001b[1;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mepoch_num\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     34\u001b[0m             \u001b[1;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mn_batch\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 35\u001b[1;33m                 \u001b[0msess\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtrain_step\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mfeed_dict\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m{\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m:\u001b[0m\u001b[0mtrain_x\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m:\u001b[0m\u001b[0mtrain_y\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     36\u001b[0m                 \u001b[0mtrain_loss\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msess\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mloss\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mfeed_dict\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m{\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m:\u001b[0m\u001b[0mtrain_x\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m:\u001b[0m\u001b[0mtrain_y\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     37\u001b[0m             \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'train loss is'\u001b[0m\u001b[1;33m+\u001b[0m \u001b[0mstr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtrain_loss\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\envs\\py35\\lib\\site-packages\\tensorflow\\python\\client\\session.py\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m    927\u001b[0m     \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    928\u001b[0m       result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[1;32m--> 929\u001b[1;33m                          run_metadata_ptr)\n\u001b[0m\u001b[0;32m    930\u001b[0m       \u001b[1;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    931\u001b[0m         \u001b[0mproto_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\envs\\py35\\lib\\site-packages\\tensorflow\\python\\client\\session.py\u001b[0m in \u001b[0;36m_run\u001b[1;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m   1126\u001b[0m                              \u001b[1;34m'which has shape %r'\u001b[0m \u001b[1;33m%\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1127\u001b[0m                              (np_val.shape, subfeed_t.name,\n\u001b[1;32m-> 1128\u001b[1;33m                               str(subfeed_t.get_shape())))\n\u001b[0m\u001b[0;32m   1129\u001b[0m           \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgraph\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mis_feedable\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msubfeed_t\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1130\u001b[0m             \u001b[1;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Tensor %s may not be fed.'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0msubfeed_t\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mValueError\u001b[0m: Cannot feed value of shape (1606,) for Tensor 'Placeholder_1:0', which has shape '(?, 1)'"
     ]
    }
   ],
   "source": [
    "y_pred_regression = LSTM_fun(INPUT_DIM, X_train, y_train_regression, X_test, y_test_regression,seq_len=PAST_TIME_STEPS)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "INPUT_DIM = data_train.shape[1]\n",
    "output_dim = 1\n",
    "batch_size = 8 #每轮训练模型时，样本的数量\n",
    "epochs = 100 #训练60轮次\n",
    "hidden_size = 128\n",
    "lstm_units = 64"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(?, 1, 64)\n"
     ]
    }
   ],
   "source": [
    "inputs = Input(shape=(PAST_TIME_STEPS, INPUT_DIM))\n",
    "#drop1 = Dropout(0.3)(inputs)\n",
    "x = Conv1D(filters = 64, kernel_size = 1, activation = 'relu')(inputs)  #, padding = 'same'\n",
    "#x = Conv1D(filters=128, kernel_size=5, activation='relu')(output1)#embedded_sequences\n",
    "x = MaxPooling1D(pool_size = PAST_TIME_STEPS)(x)\n",
    "x = Dropout(0.1)(x)\n",
    "print(x.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(?, 128)\n"
     ]
    }
   ],
   "source": [
    "lstm_out = Bidirectional(LSTM(lstm_units, activation='relu'), name='bilstm')(x)\n",
    "#lstm_out = LSTM(lstm_units,activation='relu')(x)\n",
    "print(lstm_out.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "# ATTENTION PART STARTS HERE\n",
    "attention_probs = Dense(128, activation='sigmoid', name='attention_vec')(lstm_out)\n",
    "#attention_mul=layers.merge([stm_out,attention_probs], output_shape],mode='concat',concat_axis=1))\n",
    "attention_mul =Multiply()([lstm_out, attention_probs])\n",
    "#attention_mul = merge([lstm_out, attention_probs],output_shape=32, name='attention_mul', mode='mul')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "input_1 (InputLayer)            (None, 10, 6)        0                                            \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_1 (Conv1D)               (None, 10, 64)       448         input_1[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling1d_1 (MaxPooling1D)  (None, 1, 64)        0           conv1d_1[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "dropout_1 (Dropout)             (None, 1, 64)        0           max_pooling1d_1[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "bilstm (Bidirectional)          (None, 128)          66048       dropout_1[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "attention_vec (Dense)           (None, 128)          16512       bilstm[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "multiply_1 (Multiply)           (None, 128)          0           bilstm[0][0]                     \n",
      "                                                                 attention_vec[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "dense_1 (Dense)                 (None, 1)            129         multiply_1[0][0]                 \n",
      "==================================================================================================\n",
      "Total params: 83,137\n",
      "Trainable params: 83,137\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "output_regression = Dense(1, activation='linear')(attention_mul)\n",
    "#output = Dense(10, activation='sigmoid')(drop2)\n",
    "\n",
    "model_regression = Model(inputs=inputs, outputs=output_regression)\n",
    "print(model_regression.summary())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 1606 samples, validate on 392 samples\n",
      "Epoch 1/100\n",
      "1606/1606 [==============================] - 3s 2ms/step - loss: 9484376.1009 - mean_squared_error: 9484376.1009 - val_loss: 10966773.7041 - val_mean_squared_error: 10966773.7041\n",
      "Epoch 2/100\n",
      "1606/1606 [==============================] - 1s 449us/step - loss: 4727490.7651 - mean_squared_error: 4727490.7651 - val_loss: 1813777.6849 - val_mean_squared_error: 1813777.6849\n",
      "Epoch 3/100\n",
      "1606/1606 [==============================] - 1s 458us/step - loss: 612669.6503 - mean_squared_error: 612669.6503 - val_loss: 73522.7389 - val_mean_squared_error: 73522.7389\n",
      "Epoch 4/100\n",
      "1606/1606 [==============================] - 1s 459us/step - loss: 362493.0316 - mean_squared_error: 362493.0316 - val_loss: 60282.9532 - val_mean_squared_error: 60282.9532\n",
      "Epoch 5/100\n",
      "1606/1606 [==============================] - 1s 447us/step - loss: 296150.9344 - mean_squared_error: 296150.9344 - val_loss: 52303.3975 - val_mean_squared_error: 52303.3975\n",
      "Epoch 6/100\n",
      "1606/1606 [==============================] - 1s 591us/step - loss: 255609.9004 - mean_squared_error: 255609.9004 - val_loss: 46165.8771 - val_mean_squared_error: 46165.8771\n",
      "Epoch 7/100\n",
      "1606/1606 [==============================] - 1s 498us/step - loss: 205589.0029 - mean_squared_error: 205589.0029 - val_loss: 41032.2510 - val_mean_squared_error: 41032.2510\n",
      "Epoch 8/100\n",
      "1606/1606 [==============================] - 1s 448us/step - loss: 177761.2179 - mean_squared_error: 177761.2179 - val_loss: 37203.0079 - val_mean_squared_error: 37203.0079\n",
      "Epoch 9/100\n",
      "1606/1606 [==============================] - ETA: 0s - loss: 155111.4111 - mean_squared_error: 155111.41 - 1s 514us/step - loss: 153409.5447 - mean_squared_error: 153409.5447 - val_loss: 32988.1283 - val_mean_squared_error: 32988.1283\n",
      "Epoch 10/100\n",
      "1606/1606 [==============================] - 1s 509us/step - loss: 133080.9494 - mean_squared_error: 133080.9494 - val_loss: 29948.3613 - val_mean_squared_error: 29948.3613\n",
      "Epoch 11/100\n",
      "1606/1606 [==============================] - 1s 511us/step - loss: 115925.1869 - mean_squared_error: 115925.1869 - val_loss: 27630.3468 - val_mean_squared_error: 27630.3468\n",
      "Epoch 12/100\n",
      "1606/1606 [==============================] - 1s 415us/step - loss: 94934.0531 - mean_squared_error: 94934.0531 - val_loss: 25786.7799 - val_mean_squared_error: 25786.7799\n",
      "Epoch 13/100\n",
      "1606/1606 [==============================] - 1s 452us/step - loss: 79127.1764 - mean_squared_error: 79127.1764 - val_loss: 24386.2572 - val_mean_squared_error: 24386.2572\n",
      "Epoch 14/100\n",
      "1606/1606 [==============================] - 1s 458us/step - loss: 75060.0361 - mean_squared_error: 75060.0361 - val_loss: 23163.6034 - val_mean_squared_error: 23163.6034\n",
      "Epoch 15/100\n",
      "1606/1606 [==============================] - 1s 427us/step - loss: 68251.7528 - mean_squared_error: 68251.7528 - val_loss: 22472.5105 - val_mean_squared_error: 22472.5105\n",
      "Epoch 16/100\n",
      "1606/1606 [==============================] - 1s 400us/step - loss: 62001.7798 - mean_squared_error: 62001.7798 - val_loss: 21655.2802 - val_mean_squared_error: 21655.2802\n",
      "Epoch 17/100\n",
      "1606/1606 [==============================] - 1s 445us/step - loss: 62641.4264 - mean_squared_error: 62641.4264 - val_loss: 21213.1665 - val_mean_squared_error: 21213.1665\n",
      "Epoch 18/100\n",
      "1606/1606 [==============================] - 1s 430us/step - loss: 55267.0452 - mean_squared_error: 55267.0452 - val_loss: 20972.7655 - val_mean_squared_error: 20972.7655\n",
      "Epoch 19/100\n",
      "1606/1606 [==============================] - 1s 433us/step - loss: 54416.8714 - mean_squared_error: 54416.8714 - val_loss: 21968.9417 - val_mean_squared_error: 21968.9417\n",
      "Epoch 20/100\n",
      "1606/1606 [==============================] - 1s 427us/step - loss: 51763.4796 - mean_squared_error: 51763.4796 - val_loss: 20110.3559 - val_mean_squared_error: 20110.3559\n",
      "Epoch 21/100\n",
      "1606/1606 [==============================] - 1s 441us/step - loss: 54464.1632 - mean_squared_error: 54464.1632 - val_loss: 19909.8268 - val_mean_squared_error: 19909.8268\n",
      "Epoch 22/100\n",
      "1606/1606 [==============================] - 1s 451us/step - loss: 49476.8922 - mean_squared_error: 49476.8922 - val_loss: 19776.4399 - val_mean_squared_error: 19776.4399\n",
      "Epoch 23/100\n",
      "1606/1606 [==============================] - 1s 546us/step - loss: 52515.7828 - mean_squared_error: 52515.7828 - val_loss: 20146.1637 - val_mean_squared_error: 20146.1637\n",
      "Epoch 24/100\n",
      "1606/1606 [==============================] - 1s 518us/step - loss: 49914.6387 - mean_squared_error: 49914.6387 - val_loss: 19580.4008 - val_mean_squared_error: 19580.4008\n",
      "Epoch 25/100\n",
      "1606/1606 [==============================] - 1s 573us/step - loss: 50639.7875 - mean_squared_error: 50639.7875 - val_loss: 19753.9472 - val_mean_squared_error: 19753.9472\n",
      "Epoch 26/100\n",
      "1606/1606 [==============================] - 1s 529us/step - loss: 48400.2001 - mean_squared_error: 48400.2001 - val_loss: 19524.5619 - val_mean_squared_error: 19524.5619\n",
      "Epoch 27/100\n",
      "1606/1606 [==============================] - 1s 483us/step - loss: 54420.2399 - mean_squared_error: 54420.2399 - val_loss: 19427.8416 - val_mean_squared_error: 19427.8416\n",
      "Epoch 28/100\n",
      "1606/1606 [==============================] - 1s 460us/step - loss: 52495.9603 - mean_squared_error: 52495.9603 - val_loss: 19395.5393 - val_mean_squared_error: 19395.5393\n",
      "Epoch 29/100\n",
      "1606/1606 [==============================] - 1s 430us/step - loss: 46993.0267 - mean_squared_error: 46993.0267 - val_loss: 19599.1635 - val_mean_squared_error: 19599.1635\n",
      "Epoch 30/100\n",
      "1606/1606 [==============================] - 1s 473us/step - loss: 52128.1956 - mean_squared_error: 52128.1956 - val_loss: 19563.3694 - val_mean_squared_error: 19563.3694\n",
      "Epoch 31/100\n",
      "1606/1606 [==============================] - 1s 495us/step - loss: 53970.5657 - mean_squared_error: 53970.5657 - val_loss: 19431.5724 - val_mean_squared_error: 19431.5724\n",
      "Epoch 32/100\n",
      "1606/1606 [==============================] - 1s 472us/step - loss: 51938.4151 - mean_squared_error: 51938.4151 - val_loss: 19452.4277 - val_mean_squared_error: 19452.4277\n",
      "Epoch 33/100\n",
      "1606/1606 [==============================] - 1s 480us/step - loss: 51278.7958 - mean_squared_error: 51278.7958 - val_loss: 19820.6989 - val_mean_squared_error: 19820.6989\n",
      "Epoch 34/100\n",
      "1606/1606 [==============================] - 1s 496us/step - loss: 51022.0555 - mean_squared_error: 51022.0555 - val_loss: 19646.5526 - val_mean_squared_error: 19646.5526\n",
      "Epoch 35/100\n",
      "1606/1606 [==============================] - 1s 473us/step - loss: 51869.2724 - mean_squared_error: 51869.2724 - val_loss: 19434.2983 - val_mean_squared_error: 19434.2983\n",
      "Epoch 36/100\n",
      "1606/1606 [==============================] - 1s 496us/step - loss: 53997.0013 - mean_squared_error: 53997.0013 - val_loss: 20353.3792 - val_mean_squared_error: 20353.3792\n",
      "Epoch 37/100\n",
      "1606/1606 [==============================] - 1s 497us/step - loss: 50134.8271 - mean_squared_error: 50134.8271 - val_loss: 19544.3525 - val_mean_squared_error: 19544.3525\n",
      "Epoch 38/100\n",
      "1606/1606 [==============================] - 1s 477us/step - loss: 52000.2921 - mean_squared_error: 52000.2921 - val_loss: 19516.5914 - val_mean_squared_error: 19516.5914\n",
      "Epoch 00038: early stopping\n",
      "1606/1606 [==============================] - 0s 130us/step\n",
      "MSE Train loss: [31531.41094765479, 31531.41094765479]\n",
      "392/392 [==============================] - 0s 125us/step\n",
      "MSE Test loss: [19516.591398278062, 19516.591398278062]\n"
     ]
    }
   ],
   "source": [
    "model_regression.compile(loss='mean_squared_error', optimizer='adam', metrics=['mse'])\n",
    "# simple early stopping\n",
    "es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=10)\n",
    "# fit model\n",
    "history_regression = model_regression.fit(X_train, y_train_regression,validation_data=(X_test, y_test_regression), epochs=epochs, batch_size=batch_size, shuffle=False, callbacks=[es])\n",
    "y_pred_regression = model_regression.predict(X_test)\n",
    "# evaluate the model\n",
    "print('MSE Train loss:', model_regression.evaluate(X_train, y_train_regression, batch_size=batch_size))\n",
    "print('MSE Test loss:', model_regression.evaluate(X_test, y_test_regression, batch_size=batch_size))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot training history\n",
    "plt.plot(y_test_regression, label='test')\n",
    "plt.plot(y_pred_regression, label='pred')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:py35]",
   "language": "python",
   "name": "conda-env-py35-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
